import { login, getInfo } from '@/api/user'
import { profile } from '@/api/employees'
import router, { asyncRoutes, constantRoutes, resetRouter } from '@/router'

import store from '..'

export default {
  namespaced: true,
  state() {
    return {
      token: '',
      userInfo: {},
      tokenTime: ''
    }
  },
  mutations: {
    setToken(state, token) {
      state.token = token
      if (token) {
      // 存完token立即存获得token的时间
        state.tokenTime = Date.now()
      } else {
        // 如果传过来的token为空，代表做的是退出，则把tokenTime设置为空
        state.tokenTime = ''
      }
    },

    setUserInfo(state, obj) {
      state.userInfo = obj
    },

    setTokenTime(state) {

    }
  },
  actions: {
    async login(ctx, obj) {
      try {
        // 发请求
        const res = await login(obj)
        // 把得到的token存起来
        ctx.commit('setToken', res.data)
        // 成功可以跳转
        router.push('/')
      } catch {
        console.log('失败了')
      }
    },

    // ctx是一个对象，我直接解构出对象里的commit
    async reqUserInfo({ commit }, to) {
      // 1. 发请求获取登录的用户基本信息
      const res = await getInfo()
      // 2. 再根据id获取他的其他信息
      const res2 = await profile(res.data.userId)
      // 把两次请求得到的信息里面的属性一一展开出来
      // 变成一个新对象整体存到userInfo里
      commit('setUserInfo', {
        ...res.data,
        ...res2.data
      })

      // 根据完整的动态路由表，进行过滤（筛选）
      // 筛选出当前用户拥有的页面路由
      const routes = asyncRoutes.filter(v => {
        if (res.data.roles.menus.includes(v.children[0].name)) {
          return true
        } else {
          return false
        }
      })

      routes.push({
        path: '*',
        component: () => import('@/views/404'),
        hidden: true
      })

      // 加到路由里面 -- 这就是给路由加路由规则
      router.addRoutes(routes)
      // 更新路由表 -- 更新后菜单才有
      router.options.routes = [...constantRoutes, ...routes]
      // router.options.routes = router.options.routes.concat(routes)
      // 刷新的机制跟你直接跳转的机制不一样，刷新时因为这些异步操作都是滞后执行的
      router.push(to)
    },

    // 为了预防以后可能要发请求做退出，所以先写一个logout
    logout({ commit, dispatch }) {
      // 是为了清空路由规则
      resetRouter()
      // 清空token
      commit('setToken', '')
      // 清空用户信息
      commit('setUserInfo', {})

      // 当前的dispatch，只能调用当前模块的方法 -- 从根调用
      // dispatch('tagsView/delAllViews', null, { root: true })
      store.dispatch('tagsView/delAllViews')

      // 清空页签
      // 跳转到登录页，并且把当前页面当做参数传过去
      router.push(`/login`)
    }
  }
}
